package com.beney.codec;

import com.alibaba.fastjson.JSON;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MessagePacketEncoder extends MessageToByteEncoder<MessagePacket> {
    // MessageToByteEncoder 室 Netty 自定义的编码器抽象类，是一个 ChannelHandler
    // 在发送数据的时候会触发使用, ByteBuf out 最终写入 TCP Socket 中

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    protected void encode(ChannelHandlerContext ctx, MessagePacket msg, ByteBuf out) throws Exception {
        byte[] packetBytes = JSON.toJSONBytes(msg);

        // 固定 4byte 用作数据长度标识，应对粘包、拆包问题
        out.writeInt(packetBytes.length);
        out.writeBytes(packetBytes);
        logger.info("[encode][连接 ({}) 发送消息 ({})]", ctx.channel().id(), msg.toString());
    }
}
